package main

import (
	"fmt"
	"logAgent/etcd"
	"logAgent/kafka"
	"logAgent/tail"
	"logAgent/utils"
	"os"
	"sync"
	"time"

	"gopkg.in/ini.v1"
)

var (
	cfg *ini.File
	wg  sync.WaitGroup
)

func init() {
	//1.初始化配置文件获取
	var err error
	cfg, err = ini.Load("conf/config.ini")
	if err != nil {
		fmt.Println("读取配置文件失败: ", err)
		os.Exit(1)
	}

	//2.初始化日志配置
	log_dir := cfg.Section("log").Key("dir").String()           //日志目录
	log_filename := cfg.Section("log").Key("filename").String() //日志文件名称
	log_level := cfg.Section("log").Key("level").String()       //日志等级
	log_timeout := cfg.Section("log").Key("timeout").MustInt(7) //日志过期时间
	err = utils.InitLog(log_dir, log_filename, log_level, log_timeout)
	if err != nil {
		fmt.Println("初始化日志配置失败: ", err)
		os.Exit(1)
	}
}

func main() {
	//0.获取本地ip
	ipStr := utils.GetLocalIP()

	//1.初始化kafak
	kafkaAddr := cfg.Section("kafka").Key("address").MustString("127.0.0.1:29092") //kafak地址
	size := cfg.Section("kafka").Key("size").MustInt(500)                          //管道大小
	err := kafka.Init(kafkaAddr, size)
	if err != nil {
		fmt.Println("初始化kafka失败: ", err)
		os.Exit(1)
	}
	utils.Log.Info("kafka 初始化成功")

	//2.1初始化etcd
	timeout := cfg.Section("etcd").Key("timeout").MustInt(5)                    //超时时间
	etcdAddr := cfg.Section("etcd").Key("address").MustString("127.0.0.1:2379") //etcd地址
	err = etcd.Init(etcdAddr, time.Duration(timeout)*time.Second)
	if err != nil {
		fmt.Println("初始化etcd失败: ", err)
		os.Exit(1)
	}
	utils.Log.Info("etcd 初始化成功")

	//2.2获取日志信息
	key := fmt.Sprintf(cfg.Section("etcd").Key("key").String(), ipStr) //etcd的key
	logEntries, err := etcd.GetLogConf(key)
	if err != nil {
		fmt.Println("获取日志信息失败: ", err)
		os.Exit(1)
	}

	//3.新建监控任务管理TailManager并执行监控任务
	tail_manager := tail.NewTailManager(logEntries)

	wg.Add(1)
	go etcd.WatchConf(key, tail_manager.GetNewConfChan())
	wg.Wait()
}
